001 /* 002 * Copyright 2004 Stephen J. McConnell. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 013 * implied. 014 * 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package net.dpml.metro.info; 020 021 import java.io.Serializable; 022 023 import net.dpml.component.Directive; 024 025 /** 026 * A <code>PartReference</code> is a serializable object that contains a key and 027 * an associated part. 028 * 029 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 030 * @version 1.0.1 031 */ 032 public class PartReference implements Serializable, Comparable 033 { 034 /** 035 * Serial version identifier. 036 */ 037 static final long serialVersionUID = 1L; 038 039 /** 040 * The key. 041 */ 042 private final String m_key; 043 044 /** 045 * The supplied argument. 046 */ 047 private final Directive m_directive; 048 049 /** 050 * The reference priority. 051 */ 052 private final int m_priority; 053 054 /** 055 * Creation of a new part reference. 056 * 057 * @param key the key identifying this part within the scope of its container 058 * @param directive the directive 059 */ 060 public PartReference( final String key, Directive directive ) 061 { 062 this( key, directive, 0 ); 063 } 064 065 /** 066 * Creation of a new part reference. 067 * 068 * @param key the key identifying this part within the scope of its container 069 * @param directive the directive 070 * @param priority the relative priority 071 */ 072 public PartReference( final String key, Directive directive, int priority ) 073 { 074 if( null == key ) 075 { 076 throw new NullPointerException( "key" ); 077 } 078 if( null == directive ) 079 { 080 throw new NullPointerException( "directive" ); 081 } 082 m_key = key; 083 m_directive = directive; 084 m_priority = priority; 085 } 086 087 /** 088 * Return the key. 089 * @return the key 090 */ 091 public String getKey() 092 { 093 return m_key; 094 } 095 096 /** 097 * Return the directive. 098 * @return the directive 099 */ 100 public Directive getDirective() 101 { 102 return m_directive; 103 } 104 105 /** 106 * Return the priority value. 107 * @return the priority ranking of this reference 108 */ 109 public int getPriority() 110 { 111 return m_priority; 112 } 113 114 /** 115 * Compare this object with the supplied object. 116 * @param other the object to compare with 117 * @return the result 118 */ 119 public int compareTo( Object other ) 120 { 121 if( null == other ) 122 { 123 throw new NullPointerException( "other" ); 124 } 125 else if( other instanceof PartReference ) 126 { 127 PartReference ref = (PartReference) other; 128 Integer p1 = new Integer( m_priority ); 129 Integer p2 = new Integer( ref.m_priority ); 130 return p1.compareTo( p2 ); 131 } 132 else 133 { 134 String suspect = other.getClass().getName(); 135 throw new IllegalArgumentException( suspect ); 136 } 137 } 138 139 /** 140 * Test if the supplied object is equal to this object. 141 * @param other the object to compare with this instance 142 * @return TRUE if the supplied object is equal to this object 143 */ 144 public boolean equals( Object other ) 145 { 146 if( null == other ) 147 { 148 return false; 149 } 150 else 151 { 152 if( !( other instanceof PartReference ) ) 153 { 154 return false; 155 } 156 else 157 { 158 PartReference reference = (PartReference) other; 159 if( !m_key.equals( reference.getKey() ) ) 160 { 161 return false; 162 } 163 else if( !m_directive.equals( reference.m_directive ) ) 164 { 165 return false; 166 } 167 else 168 { 169 return m_priority == reference.m_priority; 170 } 171 } 172 } 173 } 174 175 /** 176 * Return the hashcode for the instance. 177 * @return the instance hashcode 178 */ 179 public int hashCode() 180 { 181 int hash = m_key.hashCode(); 182 hash ^= m_directive.hashCode(); 183 hash ^= m_priority; 184 return hash; 185 } 186 187 /** 188 * Return a string representation of the instance. 189 * @return the string representation 190 */ 191 public String toString() 192 { 193 return "[reference: key=" + m_key + "directive=" + m_directive + "]"; 194 } 195 }